<?php
namespace App\Http\Service;
use App\Http\Service\BaseService;

class ContentScoringService  extends BaseService
{
    
    
    public function __construct()
    {
        parent::__construct();
       
    }

    /**
     * 计算爆料内容的基础分
     *
     * @param float $finalPrice 商品到手价
     * @param float $userReportPrice 用户爆料价
     * @param int $view_count 浏览量
     * @param int $comment_count 评论数
     * @param int $collect_count 收藏数
     * @param int $orders 下单数
     * @return float 基础分（0.6 * 优惠力度 + 0.4 * 热门度）
     */
    public static function calculateReportScore($finalPrice,$userReportPrice,$view_count,$comment_count,$collect_count,$orders)
    {
        // 计算优惠力度
        $discountStrength = ($finalPrice - $userReportPrice) / $finalPrice;
        
        // 计算热门度
        $popularity = log(
            $view_count * 0.3 + 
            $comment_count * 0.7 + 
            $collect_count * 0.5 + 
            $orders * 1.5 + 
            1
        ) / log(1000);

        // 基础分 = 0.6 * 优惠力度 + 0.4 * 热门度
        $baseScore = 0.6 * $discountStrength + 0.4 * $popularity;
        
        return $baseScore;
    }

    /**
     * 计算逛逛内容的热门度
     * @param int $view_count 浏览量
     * @param int $comment_count 评论数
     * @param int $collect_count 收藏数
     * @param int $orders 下单数
     * @return float 热门度
     */
    public static function calculatePopularityScore($view_count,$comment_count,$collect_count,$orders) 
    {
        $popularity = log(
            $view_count * 0.3 + 
            $comment_count * 0.7 + 
            $collect_count * 0.5 + 
            $orders * 1.5 + 
            1
        ) / log(1000);

        return $popularity;
    }

    /**
     * 计算时间衰减因子
     * @param int $daysPassed 距离发布的天数
     * @return float 时间衰减因子（e^{-0.1 * days}）
     */
    public static function calculateTimeDecayFactor($daysPassed)
    {
        return exp(-0.1 * $daysPassed);
    }

    /**
     * 计算最终得分（基础分 × 时间衰减因子）
     * @param float $baseScore 基础分
     * @param int $daysPassed 距离发布的天数
     * @return float 最终得分
     */
    public static function calculateFinalScore($baseScore,$daysPassed)
    {
        $timeDecay = self::calculateTimeDecayFactor($daysPassed);
        return $baseScore * $timeDecay;
    }

    /**
     * 对内容列表进行排序（综合、最新、最热、高佣金、高销量）
     * @param array $contents 内容列表（需包含必要字段）
     * @param string $sortMode 排序模式（'comprehensive', 'latest', 'hottest', 'high_commission', 'high_sales'）
     * @return array 排序后的内容列表
     */
    public static function sortContents($contents,$sortMode = 'comprehensive')
    {
        //dd($contents);
        switch ($sortMode) {
            case 'comprehensive': // 综合（按最终得分排序）
                usort($contents, function ($a, $b) {
                    $base_score_a=0;
                    $days_passed_a=0;
                    $base_score_b=0;
                    $days_passed_b=0;
                    if(isset($a['base_score'])){
                        $base_score_a=$a['base_score'];
                        $days_passed_a=$a['days_passed'];
                        $base_score_b=$b['base_score'];
                        $days_passed_b=$b['days_passed'];
                    }/*else{
                        dd($a);
                    }*/
                    
                    
                    $scoreA = self::calculateFinalScore($base_score_a,$days_passed_a);
                    //dd($scoreA);
                    $scoreB = self::calculateFinalScore($base_score_b,$days_passed_b);
                    return $scoreB <=> $scoreA; // 降序
                });
                break;

            case 'latest': // 最新（按发布时间降序）
                usort($contents, function ($a, $b) {
                    return $b['publish_time'] <=> $a['publish_time'];
                });
                break;

            case 'hottest': // 最热（按浏览量降序）
                usort($contents, function ($a, $b) {
                    return $b['view_count'] <=> $a['view_count'];
                });
                break;

            case 'high_commission': // 高佣金（按佣金降序）
                usort($contents, function ($a, $b) {
                    return $b['commission_amount'] <=> $a['commission_amount'];
                });
                break;

            case 'high_sales': // 高销量（按销量降序）
                usort($contents, function ($a, $b) {
                    return $b['sales_count'] <=> $a['sales_count'];
                });
                break;

            default:
                throw new InvalidArgumentException("Invalid sort mode: {$sortMode}");
        }

        return $contents;
    }
}

